package controller;

import io.javalin.http.Context;
import io.javalin.http.UploadedFile;
import service.UserService;
import util.JwtUtil;
import util.ResponseUtil;
import util.ValidationUtil;
import util.FileStorageUtil;

import java.util.Map;

public class UserController {
    private static final UserService userService = new UserService();


    /**
     * 用户注册接口
     */
    public static void register(Context ctx) {
        try {
            String username = ctx.bodyAsClass(Map.class).get("username").toString();
            String password = ctx.bodyAsClass(Map.class).get("password").toString();
            
            // 验证参数
            ValidationUtil.validateUsername(username);
            ValidationUtil.validatePassword(password);
            
            ctx.json(userService.register(username, password, ctx.contentType(), ctx.body()));
            
        } catch (IllegalArgumentException e) {
            ctx.json(ResponseUtil.error(e.getMessage()));
        } catch (Exception e) {
            e.printStackTrace();
            ctx.json(ResponseUtil.error("注册失败"));
        }
    }
    
    /**
     * 用户登录接口
     */
    public static void login(Context ctx) {   // 报文里面包含的信息
        try {
            String username = ctx.bodyAsClass(Map.class).get("username").toString();
            String password = ctx.bodyAsClass(Map.class).get("password").toString();
            
            // 验证参数
            ValidationUtil.validateUsername(username);
            ValidationUtil.validatePassword(password);
            
            ctx.json(userService.login(username, password, ctx.body()));
            // 以json格式传给前端
        } catch (IllegalArgumentException e) {
            ctx.json(ResponseUtil.error(e.getMessage()));
        } catch (Exception e) {
            e.printStackTrace();
            ctx.json(ResponseUtil.error("登录失败"));
        }
    }
    
    /**
     * 获取用户信息接口
     */
    public static void getUserInfo(Context ctx) {
        try {
            String token = ctx.header("Authorization");
            if (token == null || !token.startsWith("Bearer ")) {
                ctx.json(ResponseUtil.unauthorized());
                return;
            }
            
            ctx.json(userService.getUserInfo(token));
            
        } catch (Exception e) {
            e.printStackTrace();
            ctx.json(ResponseUtil.error("获取用户信息失败"));
        }
    }
    
    /**
     * 上传用户背景图片接口
     */
    public static void uploadBackground(Context ctx) {
        try {
            // 先处理 OPTIONS 请求
            if (ctx.method().equals("OPTIONS")) {
                ctx.status(200);
                return;
            }

            String token = ctx.header("Authorization");
            if (token == null || !token.startsWith("Bearer ")) {
                ctx.json(ResponseUtil.unauthorized());
                return;
            }
            
            // 检查是否有文件上传
            UploadedFile file = ctx.uploadedFile("file");
            if (file == null) {
                ctx.json(ResponseUtil.error("没有接收到文件"));
                return;
            }

            Long userId = JwtUtil.getUserIdFromToken(token.substring(7));
            
            // 验证文件
            ValidationUtil.validateImageFile(file);
            
            ctx.json(userService.updateBackgroundImage(
                userId,
                FileStorageUtil.saveCoverFile(file, userId),
                file.getContentType(),
                file.getSize(),
                true
            ));
            
        } catch (IllegalArgumentException e) {
            ctx.json(ResponseUtil.error(e.getMessage()));
        } catch (Exception e) {
            e.printStackTrace();
            ctx.json(ResponseUtil.error("上传背景图片失败: " + e.getMessage()));
        }
    }
    
    /**
     * 更新用户背景色接口
     */
    public static void updateUserBackgroundColor(Context ctx) {
        try {
            String token = ctx.header("Authorization");
            if (token == null || !token.startsWith("Bearer ")) {
                ctx.json(ResponseUtil.unauthorized());
                return;
            }
            
            Long userId = JwtUtil.getUserIdFromToken(token.substring(7));
            String backgroundColor = ctx.bodyAsClass(Map.class).get("backgroundColor").toString();
            
            // 验证颜色代码
            ValidationUtil.validateColorCode(backgroundColor);
            
            ctx.json(userService.updateBackgroundColor(userId, backgroundColor));
            
        } catch (IllegalArgumentException e) {
            ctx.json(ResponseUtil.error(e.getMessage()));
        } catch (Exception e) {
            e.printStackTrace();
            ctx.json(ResponseUtil.error("更新背景色失败"));
        }
    }
}